Commit 637250cc authored by Helge Deller's avatar Helge Deller

parisc: Enhance CPU detection code on PAT machines

This patch fixes the debug code which runs during the inventory scan on
machines with PAT firmware.

Additionally print out the relationship between the detected logical CPU
number and it's physical location and physical cpu number.
This leads to information which can be used to feed numa-structures in
the kernel in later patches. An example output is from my single-CPU (2
cores) C8000 machine is:

  Logical CPU #0 is physical cpu #0 at 0xffff0000ffff15, hpa 0xfffffffffe780000
  Logical CPU #1 is physical cpu #1 at 0xffff0000ffff15, hpa 0xfffffffffe781000
Signed-off-by: default avatarHelge Deller <deller@gmx.de>
parent 5c38602d
...@@ -289,7 +289,7 @@ extern int pdc_pat_cell_get_number(struct pdc_pat_cell_num *cell_info); ...@@ -289,7 +289,7 @@ extern int pdc_pat_cell_get_number(struct pdc_pat_cell_num *cell_info);
extern int pdc_pat_cell_module(unsigned long *actcnt, unsigned long ploc, unsigned long mod, unsigned long view_type, void *mem_addr); extern int pdc_pat_cell_module(unsigned long *actcnt, unsigned long ploc, unsigned long mod, unsigned long view_type, void *mem_addr);
extern int pdc_pat_cell_num_to_loc(void *, unsigned long); extern int pdc_pat_cell_num_to_loc(void *, unsigned long);
extern int pdc_pat_cpu_get_number(struct pdc_pat_cpu_num *cpu_info, void *hpa); extern int pdc_pat_cpu_get_number(struct pdc_pat_cpu_num *cpu_info, unsigned long hpa);
extern int pdc_pat_pd_get_addr_map(unsigned long *actual_len, void *mem_addr, unsigned long count, unsigned long offset); extern int pdc_pat_pd_get_addr_map(unsigned long *actual_len, void *mem_addr, unsigned long count, unsigned long offset);
......
...@@ -1258,7 +1258,7 @@ int pdc_pat_cell_module(unsigned long *actcnt, unsigned long ploc, unsigned long ...@@ -1258,7 +1258,7 @@ int pdc_pat_cell_module(unsigned long *actcnt, unsigned long ploc, unsigned long
* *
* Retrieve the cpu number for the cpu at the specified HPA. * Retrieve the cpu number for the cpu at the specified HPA.
*/ */
int pdc_pat_cpu_get_number(struct pdc_pat_cpu_num *cpu_info, void *hpa) int pdc_pat_cpu_get_number(struct pdc_pat_cpu_num *cpu_info, unsigned long hpa)
{ {
int retval; int retval;
unsigned long flags; unsigned long flags;
......
...@@ -216,9 +216,9 @@ pat_query_module(ulong pcell_loc, ulong mod_index) ...@@ -216,9 +216,9 @@ pat_query_module(ulong pcell_loc, ulong mod_index)
register_parisc_device(dev); /* advertise device */ register_parisc_device(dev); /* advertise device */
#ifdef DEBUG_PAT #ifdef DEBUG_PAT
pdc_pat_cell_mod_maddr_block_t io_pdc_cell;
/* dump what we see so far... */ /* dump what we see so far... */
switch (PAT_GET_ENTITY(dev->mod_info)) { switch (PAT_GET_ENTITY(dev->mod_info)) {
pdc_pat_cell_mod_maddr_block_t io_pdc_cell;
unsigned long i; unsigned long i;
case PAT_ENTITY_PROC: case PAT_ENTITY_PROC:
...@@ -259,9 +259,9 @@ pat_query_module(ulong pcell_loc, ulong mod_index) ...@@ -259,9 +259,9 @@ pat_query_module(ulong pcell_loc, ulong mod_index)
pa_pdc_cell->mod[4 + i * 3]); /* finish (ie end) */ pa_pdc_cell->mod[4 + i * 3]); /* finish (ie end) */
printk(KERN_DEBUG printk(KERN_DEBUG
" IO_VIEW %ld: 0x%016lx 0x%016lx 0x%016lx\n", " IO_VIEW %ld: 0x%016lx 0x%016lx 0x%016lx\n",
i, io_pdc_cell->mod[2 + i * 3], /* type */ i, io_pdc_cell.mod[2 + i * 3], /* type */
io_pdc_cell->mod[3 + i * 3], /* start */ io_pdc_cell.mod[3 + i * 3], /* start */
io_pdc_cell->mod[4 + i * 3]); /* finish (ie end) */ io_pdc_cell.mod[4 + i * 3]); /* finish (ie end) */
} }
printk(KERN_DEBUG "\n"); printk(KERN_DEBUG "\n");
break; break;
......
...@@ -99,6 +99,7 @@ static int processor_probe(struct parisc_device *dev) ...@@ -99,6 +99,7 @@ static int processor_probe(struct parisc_device *dev)
unsigned long txn_addr; unsigned long txn_addr;
unsigned long cpuid; unsigned long cpuid;
struct cpuinfo_parisc *p; struct cpuinfo_parisc *p;
struct pdc_pat_cpu_num cpu_info __maybe_unused;
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
if (num_online_cpus() >= nr_cpu_ids) { if (num_online_cpus() >= nr_cpu_ids) {
...@@ -123,10 +124,6 @@ static int processor_probe(struct parisc_device *dev) ...@@ -123,10 +124,6 @@ static int processor_probe(struct parisc_device *dev)
ulong status; ulong status;
unsigned long bytecnt; unsigned long bytecnt;
pdc_pat_cell_mod_maddr_block_t *pa_pdc_cell; pdc_pat_cell_mod_maddr_block_t *pa_pdc_cell;
#undef USE_PAT_CPUID
#ifdef USE_PAT_CPUID
struct pdc_pat_cpu_num cpu_info;
#endif
pa_pdc_cell = kmalloc(sizeof (*pa_pdc_cell), GFP_KERNEL); pa_pdc_cell = kmalloc(sizeof (*pa_pdc_cell), GFP_KERNEL);
if (!pa_pdc_cell) if (!pa_pdc_cell)
...@@ -145,22 +142,27 @@ static int processor_probe(struct parisc_device *dev) ...@@ -145,22 +142,27 @@ static int processor_probe(struct parisc_device *dev)
kfree(pa_pdc_cell); kfree(pa_pdc_cell);
/* get the cpu number */
status = pdc_pat_cpu_get_number(&cpu_info, dev->hpa.start);
BUG_ON(PDC_OK != status);
pr_info("Logical CPU #%lu is physical cpu #%lu at location "
"0x%lx with hpa %pa\n",
cpuid, cpu_info.cpu_num, cpu_info.cpu_loc,
&dev->hpa.start);
#undef USE_PAT_CPUID
#ifdef USE_PAT_CPUID #ifdef USE_PAT_CPUID
/* We need contiguous numbers for cpuid. Firmware's notion /* We need contiguous numbers for cpuid. Firmware's notion
* of cpuid is for physical CPUs and we just don't care yet. * of cpuid is for physical CPUs and we just don't care yet.
* We'll care when we need to query PAT PDC about a CPU *after* * We'll care when we need to query PAT PDC about a CPU *after*
* boot time (ie shutdown a CPU from an OS perspective). * boot time (ie shutdown a CPU from an OS perspective).
*/ */
/* get the cpu number */
status = pdc_pat_cpu_get_number(&cpu_info, dev->hpa.start);
BUG_ON(PDC_OK != status);
if (cpu_info.cpu_num >= NR_CPUS) { if (cpu_info.cpu_num >= NR_CPUS) {
printk(KERN_WARNING "IGNORING CPU at 0x%x," printk(KERN_WARNING "IGNORING CPU at %pa,"
" cpu_slot_id > NR_CPUS" " cpu_slot_id > NR_CPUS"
" (%ld > %d)\n", " (%ld > %d)\n",
dev->hpa.start, cpu_info.cpu_num, NR_CPUS); &dev->hpa.start, cpu_info.cpu_num, NR_CPUS);
/* Ignore CPU since it will only crash */ /* Ignore CPU since it will only crash */
boot_cpu_data.cpu_count--; boot_cpu_data.cpu_count--;
return 1; return 1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment