[PATCH] PCI PHB unit id detection interface change
Olof Johansson
olof at austin.ibm.com
Tue Jun 15 05:57:59 EST 2004
linas at austin.ibm.com wrote:
>Hi,
>
>I'm looking for sanity-check/review of the following patch.
>Turns out ath the kernel has been using a deprecated firmware
>interface for discovring the PCI PHB Unit Id's. The PHN Unit
>ID's are used for a variety of PCI operations. The patch
>below is a change to use the recommended API.
>
>Its been tested on one-each of power3,4,and 5 boxes; however,
>given that its an API change, I have some concern that someone
>might get broken by this. Please review.
>
Linas,
Your code has some CodingStyle breakage. Mostly nitpicky stuff, see below.
>------------------------------------------------------------------------
>
>Index: arch/ppc64/kernel/pSeries_pci.c
>===================================================================
>RCS file: /home/linas/cvsroot/eeh/arch/ppc64/kernel/pSeries_pci.c,v
>retrieving revision 1.1
>diff -u -p -r1.1 pSeries_pci.c
>--- a/arch/ppc64/kernel/pSeries_pci.c 8 Jun 2004 22:52:54 -0000 1.1
>+++ b/arch/ppc64/kernel/pSeries_pci.c 11 Jun 2004 21:56:41 -0000
>@@ -353,6 +353,55 @@ static void python_countermeasures(unsig
> iounmap(chip_regs);
> }
>
>+void init_pci_config_tokens (void)
>
Should this be __init?
>+{
>+ read_pci_config = rtas_token("read-pci-config");
>+ write_pci_config = rtas_token("write-pci-config");
>+ ibm_read_pci_config = rtas_token("ibm,read-pci-config");
>+ ibm_write_pci_config = rtas_token("ibm,write-pci-config");
>+}
>+
>+unsigned long get_phb_buid (struct device_node *phb)
>+{
>+ int addr_cells;
>+ unsigned int *buid_vals;
>+ unsigned int len;
>+ unsigned long buid;
>+
>+#define NEW_STYLE_BUIDS
>+#ifdef NEW_STYLE_BUIDS
>+ if (-1 == ibm_read_pci_config) return 0;
>+
>+ /* PHB's will always be children of the root node,
>+ * or so it is promised by the current firmware. */
>+ if (NULL == phb->parent) return 0;
>
It's common practice in the Linux kernel to do tests in form (<variable>
== <constant>). Good compilers should warn about missing equal signs
anyway. :)
>+ if (phb->parent->parent) return 0;
>+
>+ buid_vals = (unsigned int *) get_property(phb, "reg", &len);
>+ if (NULL == buid_vals) return 0;
>
Break if statements into two lines, please, all 4 above
Also, another constant == variable check
>+
>+ addr_cells = prom_n_addr_cells(phb);
>+ if (addr_cells == 1) {
>+ buid = (unsigned long) buid_vals[0];
>+ } else {
>+ buid = (((unsigned long)buid_vals[0]) << 32UL) |
>+ (((unsigned long)buid_vals[1]) & 0xffffffff);
>+ }
>+#else
>+ // The use of ibm,fw-phb-id is deprecated. Keep a copy of this
>+ // code for reference, in case the above code needs to be rolled back.
>
Please stick to C-style comments, i.e. /* */
Also, revision control is good enough to track old code for reference,
instead of keeping it cluttered with #ifdefs. So please take out the old
code alltogether.
>+ buid_vals = (int *) get_property(phb, "ibm,fw-phb-id", &len);
>+ if (buid_vals == NULL) return 0;
>
break in two lines
>+ if (len < 2 * sizeof(int)) {
>+ buid = (unsigned long) buid_vals[0];
>+ } else {
>+ buid = (((unsigned long)buid_vals[0]) << 32UL) |
>+ (((unsigned long)buid_vals[1]) & 0xffffffff);
>+ }
>+#endif
>+ return buid;
>+}
>+
> struct pci_controller *alloc_phb(struct device_node *dev,
> unsigned int addr_size_words)
> {
>@@ -360,7 +409,6 @@ struct pci_controller *alloc_phb(struct
> unsigned int *ui_ptr = NULL, len;
> struct reg_property64 reg_struct;
> int *bus_range;
>- int *buid_vals;
> char *model;
> enum phb_types phb_type;
> struct property *of_prop;
>@@ -431,18 +479,7 @@ struct pci_controller *alloc_phb(struct
> phb->arch_data = dev;
> phb->ops = &rtas_pci_ops;
>
>- buid_vals = (int *) get_property(dev, "ibm,fw-phb-id", &len);
>-
>- if (buid_vals == NULL) {
>- phb->buid = 0;
>- } else {
>- if (len < 2 * sizeof(int))
>- // Support for new OF that only has 1 integer for buid.
>- phb->buid = (unsigned long)buid_vals[0];
>- else
>- phb->buid = (((unsigned long)buid_vals[0]) << 32UL) |
>- (((unsigned long)buid_vals[1]) & 0xffffffff);
>- }
>+ phb->buid = get_phb_buid (dev);
>
Take out space between function name and ()
>
> return phb;
> }
>@@ -456,10 +493,7 @@ unsigned long __init find_and_init_phbs(
> unsigned int *opprop;
> struct device_node *root = of_find_node_by_path("/");
>
>- read_pci_config = rtas_token("read-pci-config");
>- write_pci_config = rtas_token("write-pci-config");
>- ibm_read_pci_config = rtas_token("ibm,read-pci-config");
>- ibm_write_pci_config = rtas_token("ibm,write-pci-config");
>+ init_pci_config_tokens();
>
> if (naca->interrupt_controller == IC_OPEN_PIC) {
> opprop = (unsigned int *)get_property(root,
>--- arch/ppc64/kernel/eeh.c.7.69-orig 2004-06-11 14:10:19.000000000 -0500
>+++ arch/ppc64/kernel/eeh.c 2004-06-11 16:50:55.000000000 -0500
>@@ -40,6 +40,10 @@
> #define CONFIG_ADDR(busno, devfn) \
> (((((busno) & 0xff) << 8) | ((devfn) & 0xf8)) << 8)
>
>+/* From pSeries_pci.h */
>+extern void init_pci_config_tokens (void);
>+extern unsigned long get_phb_buid (struct device_node *);
>+
>
> /* RTAS tokens */
> static int ibm_set_eeh_option;
> static int ibm_set_slot_reset;
>@@ -645,7 +649,7 @@ static void *early_enable_eeh(struct dev
> dn->full_name);
> #endif
> } else {
>- printk(KERN_WARNING "EEH: %s: rtas_call failed.\n",
>+ printk(KERN_WARNING "EEH: %s: could not enable EEH, rtas_call failed.\n",
> dn->full_name);
> }
> } else {
>@@ -709,24 +713,16 @@ void __init eeh_init(void)
> }
>
> /* Enable EEH for all adapters. Note that eeh requires buid's */
>+ init_pci_config_tokens();
>
Why do you need this here? Is EEH code ever called before
find_and_init_phbs? If so, can't you make the init_pci_config_tokens()
an early_initcall() to avoid calling it twice?
> for (phb = of_find_node_by_name(NULL, "pci"); phb;
> phb = of_find_node_by_name(phb, "pci")) {
>- int len;
>- int *buid_vals;
>+ unsigned long buid;
>
>- buid_vals = (int *)get_property(phb, "ibm,fw-phb-id", &len);
>- if (!buid_vals)
>- continue;
>- if (len == sizeof(int)) {
>- info.buid_lo = buid_vals[0];
>- info.buid_hi = 0;
>- } else if (len == sizeof(int)*2) {
>- info.buid_hi = buid_vals[0];
>- info.buid_lo = buid_vals[1];
>- } else {
>- printk(KERN_INFO "EEH: odd ibm,fw-phb-id len returned: %d\n", len);
>- continue;
>- }
>+ buid = get_phb_buid (phb);
>+ if (0 == buid) continue;
>
break in two lines
>+
>+ info.buid_lo = BUID_LO(buid);
>+ info.buid_hi = BUID_HI(buid);
> traverse_pci_devices(phb, early_enable_eeh, NULL, &info);
> }
>
>
>
** Sent via the linuxppc64-dev mail list. See http://lists.linuxppc.org/
More information about the Linuxppc64-dev
mailing list