Commit ada1da31 authored by Alexander Gordeev's avatar Alexander Gordeev Committed by Vasily Gorbik

s390/sclp: sort out physical vs virtual pointers usage

Provide physical addresses whenever the hardware interface
expects it or a 32-bit value used for tracking.

Variable sclp_early_sccb gets initialized in the decompressor
and points to an address in physcal memory. Yet, it is used
as virtual memory pointer and therefore should be converted.

Note, the other two __bootdata variables sclp_info_sccb and
sclp_info_sccb_valid contain plain data, but no pointers and
do need any special care.
Reviewed-by: default avatarHeiko Carstens <hca@linux.ibm.com>
Signed-off-by: default avatarAlexander Gordeev <agordeev@linux.ibm.com>
Signed-off-by: default avatarVasily Gorbik <gor@linux.ibm.com>
parent dd9089b6
...@@ -117,6 +117,7 @@ struct zpci_report_error_header { ...@@ -117,6 +117,7 @@ struct zpci_report_error_header {
extern char *sclp_early_sccb; extern char *sclp_early_sccb;
void sclp_early_adjust_va(void);
void sclp_early_set_buffer(void *sccb); void sclp_early_set_buffer(void *sccb);
int sclp_early_read_info(void); int sclp_early_read_info(void);
int sclp_early_read_storage_info(void); int sclp_early_read_storage_info(void);
......
...@@ -296,6 +296,7 @@ static void __init check_image_bootable(void) ...@@ -296,6 +296,7 @@ static void __init check_image_bootable(void)
void __init startup_init(void) void __init startup_init(void)
{ {
sclp_early_adjust_va();
reset_tod_clock(); reset_tod_clock();
check_image_bootable(); check_image_bootable();
time_early_init(); time_early_init();
......
...@@ -163,7 +163,7 @@ static inline void sclp_trace_req(int prio, char *id, struct sclp_req *req, ...@@ -163,7 +163,7 @@ static inline void sclp_trace_req(int prio, char *id, struct sclp_req *req,
summary.timeout = (u16)req->queue_timeout; summary.timeout = (u16)req->queue_timeout;
summary.start_count = (u16)req->start_count; summary.start_count = (u16)req->start_count;
sclp_trace(prio, id, (u32)(addr_t)sccb, summary.b, err); sclp_trace(prio, id, __pa(sccb), summary.b, err);
} }
static inline void sclp_trace_register(int prio, char *id, u32 a, u64 b, static inline void sclp_trace_register(int prio, char *id, u32 a, u64 b,
...@@ -502,7 +502,7 @@ sclp_add_request(struct sclp_req *req) ...@@ -502,7 +502,7 @@ sclp_add_request(struct sclp_req *req)
} }
/* RQAD: Request was added (a=sccb, b=caller) */ /* RQAD: Request was added (a=sccb, b=caller) */
sclp_trace(2, "RQAD", (u32)(addr_t)req->sccb, _RET_IP_, false); sclp_trace(2, "RQAD", __pa(req->sccb), _RET_IP_, false);
req->status = SCLP_REQ_QUEUED; req->status = SCLP_REQ_QUEUED;
req->start_count = 0; req->start_count = 0;
...@@ -617,15 +617,15 @@ __sclp_find_req(u32 sccb) ...@@ -617,15 +617,15 @@ __sclp_find_req(u32 sccb)
list_for_each(l, &sclp_req_queue) { list_for_each(l, &sclp_req_queue) {
req = list_entry(l, struct sclp_req, list); req = list_entry(l, struct sclp_req, list);
if (sccb == (u32) (addr_t) req->sccb) if (sccb == __pa(req->sccb))
return req; return req;
} }
return NULL; return NULL;
} }
static bool ok_response(u32 sccb_int, sclp_cmdw_t cmd) static bool ok_response(u32 sccb_int, sclp_cmdw_t cmd)
{ {
struct sccb_header *sccb = (struct sccb_header *)(addr_t)sccb_int; struct sccb_header *sccb = (struct sccb_header *)__va(sccb_int);
struct evbuf_header *evbuf; struct evbuf_header *evbuf;
u16 response; u16 response;
...@@ -664,7 +664,7 @@ static void sclp_interrupt_handler(struct ext_code ext_code, ...@@ -664,7 +664,7 @@ static void sclp_interrupt_handler(struct ext_code ext_code,
/* INT: Interrupt received (a=intparm, b=cmd) */ /* INT: Interrupt received (a=intparm, b=cmd) */
sclp_trace_sccb(0, "INT", param32, active_cmd, active_cmd, sclp_trace_sccb(0, "INT", param32, active_cmd, active_cmd,
(struct sccb_header *)(addr_t)finished_sccb, (struct sccb_header *)__va(finished_sccb),
!ok_response(finished_sccb, active_cmd)); !ok_response(finished_sccb, active_cmd));
if (finished_sccb) { if (finished_sccb) {
...@@ -1110,7 +1110,7 @@ static void sclp_check_handler(struct ext_code ext_code, ...@@ -1110,7 +1110,7 @@ static void sclp_check_handler(struct ext_code ext_code,
/* Is this the interrupt we are waiting for? */ /* Is this the interrupt we are waiting for? */
if (finished_sccb == 0) if (finished_sccb == 0)
return; return;
if (finished_sccb != (u32) (addr_t) sclp_init_sccb) if (finished_sccb != __pa(sclp_init_sccb))
panic("sclp: unsolicited interrupt for buffer at 0x%x\n", panic("sclp: unsolicited interrupt for buffer at 0x%x\n",
finished_sccb); finished_sccb);
spin_lock(&sclp_lock); spin_lock(&sclp_lock);
......
...@@ -333,7 +333,7 @@ static inline int sclp_service_call(sclp_cmdw_t command, void *sccb) ...@@ -333,7 +333,7 @@ static inline int sclp_service_call(sclp_cmdw_t command, void *sccb)
"2:\n" "2:\n"
EX_TABLE(0b, 2b) EX_TABLE(0b, 2b)
EX_TABLE(1b, 2b) EX_TABLE(1b, 2b)
: "+&d" (cc) : "d" (command), "a" ((unsigned long)sccb) : "+&d" (cc) : "d" (command), "a" (__pa(sccb))
: "cc", "memory"); : "cc", "memory");
if (cc == 4) if (cc == 4)
return -EINVAL; return -EINVAL;
......
...@@ -155,6 +155,11 @@ static void __init sclp_early_console_detect(struct init_sccb *sccb) ...@@ -155,6 +155,11 @@ static void __init sclp_early_console_detect(struct init_sccb *sccb)
sclp.has_linemode = 1; sclp.has_linemode = 1;
} }
void __init sclp_early_adjust_va(void)
{
sclp_early_sccb = __va((unsigned long)sclp_early_sccb);
}
void __init sclp_early_detect(void) void __init sclp_early_detect(void)
{ {
void *sccb = sclp_early_sccb; void *sccb = sclp_early_sccb;
......
...@@ -194,7 +194,7 @@ static int sclp_sd_sync(unsigned long page, u8 eq, u8 di, u64 sat, u64 sa, ...@@ -194,7 +194,7 @@ static int sclp_sd_sync(unsigned long page, u8 eq, u8 di, u64 sat, u64 sa,
struct sclp_sd_evbuf *evbuf; struct sclp_sd_evbuf *evbuf;
int rc; int rc;
sclp_sd_listener_init(&listener, (u32) (addr_t) sccb); sclp_sd_listener_init(&listener, __pa(sccb));
sclp_sd_listener_add(&listener); sclp_sd_listener_add(&listener);
/* Prepare SCCB */ /* Prepare SCCB */
......
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