amdnb_misc.c revision 1.1
11.1Scegger/* $NetBSD: amdnb_misc.c,v 1.1 2012/04/13 13:11:17 cegger Exp $ */ 21.1Scegger/* 31.1Scegger * Copyright (c) 2012 The NetBSD Foundation, Inc. 41.1Scegger * All rights reserved. 51.1Scegger * 61.1Scegger * This code is derived from software contributed to The NetBSD Foundation 71.1Scegger * by Christoph Egger. 81.1Scegger * 91.1Scegger * Redistribution and use in source and binary forms, with or without 101.1Scegger * modification, are permitted provided that the following conditions 111.1Scegger * are met: 121.1Scegger * 1. Redistributions of source code must retain the above copyright 131.1Scegger * notice, this list of conditions and the following disclaimer. 141.1Scegger * 2. Redistributions in binary form must reproduce the above copyright 151.1Scegger * notice, this list of conditions and the following disclaimer in the 161.1Scegger * documentation and/or other materials provided with the distribution. 171.1Scegger * 181.1Scegger * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 191.1Scegger * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 201.1Scegger * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 211.1Scegger * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 221.1Scegger * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 231.1Scegger * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 241.1Scegger * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 251.1Scegger * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 261.1Scegger * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 271.1Scegger * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 281.1Scegger * POSSIBILITY OF SUCH DAMAGE. 291.1Scegger */ 301.1Scegger 311.1Scegger#include <sys/cdefs.h> 321.1Scegger__KERNEL_RCSID(0, "$NetBSD: amdnb_misc.c,v 1.1 2012/04/13 13:11:17 cegger Exp $"); 331.1Scegger 341.1Scegger#include <sys/param.h> 351.1Scegger#include <sys/device.h> 361.1Scegger 371.1Scegger#include <dev/pci/pcireg.h> 381.1Scegger#include <dev/pci/pcivar.h> 391.1Scegger#include <dev/pci/pcidevs.h> 401.1Scegger 411.1Sceggerstatic int amdnb_misc_match(device_t, cfdata_t match, void *); 421.1Sceggerstatic void amdnb_misc_attach(device_t, device_t, void *); 431.1Sceggerstatic int amdnb_misc_detach(device_t, int); 441.1Scegger 451.1SceggerCFATTACH_DECL_NEW(amdnb_misc, 0, 461.1Scegger amdnb_misc_match, amdnb_misc_attach, amdnb_misc_detach, NULL); 471.1Scegger 481.1Scegger 491.1Sceggerstatic int 501.1Sceggeramdnb_misc_match(device_t parent, cfdata_t match, void *aux) 511.1Scegger{ 521.1Scegger struct pci_attach_args *pa = aux; 531.1Scegger 541.1Scegger if (PCI_VENDOR(pa->pa_id) != PCI_VENDOR_AMD) 551.1Scegger return 0; 561.1Scegger 571.1Scegger switch (PCI_PRODUCT(pa->pa_id)) { 581.1Scegger case PCI_PRODUCT_AMD_AMD64_MISC: 591.1Scegger case PCI_PRODUCT_AMD_AMD64_F10_MISC: 601.1Scegger case PCI_PRODUCT_AMD_AMD64_F11_MISC: 611.1Scegger case PCI_PRODUCT_AMD_F14_NB: /* Family 12h, too */ 621.1Scegger case PCI_PRODUCT_AMD_F15_MISC: 631.1Scegger break; 641.1Scegger default: 651.1Scegger return 0; 661.1Scegger } 671.1Scegger 681.1Scegger return 2; /* supercede pchb(4) */ 691.1Scegger} 701.1Scegger 711.1Sceggerstatic int 721.1Sceggeramdnb_misc_search(device_t parent, cfdata_t cf, const int *locs, void *aux) 731.1Scegger{ 741.1Scegger if (config_match(parent, cf, aux)) 751.1Scegger config_attach_loc(parent, cf, locs, aux, NULL); 761.1Scegger 771.1Scegger return 0; 781.1Scegger} 791.1Scegger 801.1Sceggerstatic void 811.1Sceggeramdnb_misc_attach(device_t parent, device_t self, void *aux) 821.1Scegger{ 831.1Scegger aprint_naive("\n"); 841.1Scegger aprint_normal(": AMD NB Misc Configuration\n"); 851.1Scegger 861.1Scegger if (!pmf_device_register(self, NULL, NULL)) 871.1Scegger aprint_error_dev(self, "couldn't establish power handler\n"); 881.1Scegger 891.1Scegger config_search_loc(amdnb_misc_search, self, "amdnb_miscbus", NULL, aux); 901.1Scegger return; 911.1Scegger} 921.1Scegger 931.1Sceggerstatic int 941.1Sceggeramdnb_misc_detach(device_t self, int flags) 951.1Scegger{ 961.1Scegger int rv; 971.1Scegger 981.1Scegger rv = config_detach_children(self, flags); 991.1Scegger if (rv != 0) 1001.1Scegger return rv; 1011.1Scegger 1021.1Scegger pmf_device_deregister(self); 1031.1Scegger return rv; 1041.1Scegger} 105