diff options
Diffstat (limited to 'arch/arm/mach-apple/rtkit.c')
| -rw-r--r-- | arch/arm/mach-apple/rtkit.c | 69 | 
1 files changed, 56 insertions, 13 deletions
| diff --git a/arch/arm/mach-apple/rtkit.c b/arch/arm/mach-apple/rtkit.c index 5e8e282ec0e..d294ee09350 100644 --- a/arch/arm/mach-apple/rtkit.c +++ b/arch/arm/mach-apple/rtkit.c @@ -19,6 +19,7 @@  #define APPLE_RTKIT_EP_SYSLOG 2  #define APPLE_RTKIT_EP_DEBUG 3  #define APPLE_RTKIT_EP_IOREPORT 4 +#define APPLE_RTKIT_EP_OSLOG 8  #define APPLE_RTKIT_EP_TRACEKIT 10  /* Messages for management endpoint. */ @@ -47,6 +48,11 @@  #define APPLE_RTKIT_MGMT_EPMAP_REPLY 8  #define APPLE_RTKIT_MGMT_EPMAP_REPLY_MORE BIT(0) +#define APPLE_RTKIT_OSLOG_TYPE GENMASK_ULL(63, 56) +#define APPLE_RTKIT_OSLOG_BUFFER_REQUEST 1 +#define APPLE_RTKIT_OSLOG_SIZE GENMASK_ULL(55, 36) +#define APPLE_RTKIT_OSLOG_IOVA GENMASK_ULL(35, 0) +  #define APPLE_RTKIT_MIN_SUPPORTED_VERSION 11  #define APPLE_RTKIT_MAX_SUPPORTED_VERSION 12 @@ -66,6 +72,7 @@ struct apple_rtkit {  	struct apple_rtkit_buffer syslog_buffer;  	struct apple_rtkit_buffer crashlog_buffer;  	struct apple_rtkit_buffer ioreport_buffer; +	struct apple_rtkit_buffer oslog_buffer;  	int iop_pwr;  	int ap_pwr; @@ -98,6 +105,8 @@ void apple_rtkit_free(struct apple_rtkit *rtk)  			rtk->shmem_destroy(rtk->cookie, &rtk->crashlog_buffer);  		if (rtk->ioreport_buffer.buffer)  			rtk->shmem_destroy(rtk->cookie, &rtk->ioreport_buffer); +		if (rtk->oslog_buffer.buffer) +			rtk->shmem_destroy(rtk->cookie, &rtk->oslog_buffer);  	} else {  		if (rtk->syslog_buffer.buffer)  			free(rtk->syslog_buffer.buffer); @@ -105,6 +114,8 @@ void apple_rtkit_free(struct apple_rtkit *rtk)  			free(rtk->crashlog_buffer.buffer);  		if (rtk->ioreport_buffer.buffer)  			free(rtk->ioreport_buffer.buffer); +		if (rtk->oslog_buffer.buffer) +			free(rtk->oslog_buffer.buffer);  	}  	free(rtk);  } @@ -112,16 +123,8 @@ void apple_rtkit_free(struct apple_rtkit *rtk)  static int rtkit_handle_buf_req(struct apple_rtkit *rtk, int endpoint, struct apple_mbox_msg *msg)  {  	struct apple_rtkit_buffer *buf; -	size_t num_4kpages;  	int ret; -	num_4kpages = FIELD_GET(APPLE_RTKIT_BUFFER_REQUEST_SIZE, msg->msg0); - -	if (num_4kpages == 0) { -		printf("%s: unexpected request for buffer without size\n", __func__); -		return -1; -	} -  	switch (endpoint) {  	case APPLE_RTKIT_EP_CRASHLOG:  		buf = &rtk->crashlog_buffer; @@ -132,13 +135,31 @@ static int rtkit_handle_buf_req(struct apple_rtkit *rtk, int endpoint, struct ap  	case APPLE_RTKIT_EP_IOREPORT:  		buf = &rtk->ioreport_buffer;  		break; +	case APPLE_RTKIT_EP_OSLOG: +		buf = &rtk->oslog_buffer; +		break;  	default:  		printf("%s: unexpected endpoint %d\n", __func__, endpoint);  		return -1;  	} +	switch (endpoint) { +	case APPLE_RTKIT_EP_OSLOG: +		buf->size = FIELD_GET(APPLE_RTKIT_OSLOG_SIZE, msg->msg0); +		buf->dva = FIELD_GET(APPLE_RTKIT_OSLOG_IOVA, msg->msg0 << 12); +		break; +	default: +		buf->size = FIELD_GET(APPLE_RTKIT_BUFFER_REQUEST_SIZE, msg->msg0) << 12; +		buf->dva = FIELD_GET(APPLE_RTKIT_BUFFER_REQUEST_IOVA, msg->msg0); +		break; +	} + +	if (buf->size == 0) { +		printf("%s: unexpected request for buffer without size\n", __func__); +		return -1; +	} +  	buf->dva = FIELD_GET(APPLE_RTKIT_BUFFER_REQUEST_IOVA, msg->msg0); -	buf->size = num_4kpages << 12;  	buf->is_mapped = !!buf->dva;  	if (rtk->shmem_setup) { @@ -157,10 +178,18 @@ static int rtkit_handle_buf_req(struct apple_rtkit *rtk, int endpoint, struct ap  	}  	if (!buf->is_mapped) { -		msg->msg0 = FIELD_PREP(APPLE_RTKIT_MGMT_TYPE, APPLE_RTKIT_BUFFER_REQUEST) | -				FIELD_PREP(APPLE_RTKIT_BUFFER_REQUEST_SIZE, num_4kpages) | -				FIELD_PREP(APPLE_RTKIT_BUFFER_REQUEST_IOVA, buf->dva); -		msg->msg1 = endpoint; +		/* oslog uses different fields */ +		if (endpoint == APPLE_RTKIT_EP_OSLOG) { +			msg->msg0 = FIELD_PREP(APPLE_RTKIT_OSLOG_TYPE, +					       APPLE_RTKIT_OSLOG_BUFFER_REQUEST); +			msg->msg0 |= FIELD_PREP(APPLE_RTKIT_OSLOG_SIZE, buf->size); +			msg->msg0 |= FIELD_PREP(APPLE_RTKIT_OSLOG_IOVA, buf->dva >> 12); +		} else { +			msg->msg0 = FIELD_PREP(APPLE_RTKIT_MGMT_TYPE, +					   APPLE_RTKIT_BUFFER_REQUEST); +			msg->msg0 |= FIELD_PREP(APPLE_RTKIT_BUFFER_REQUEST_SIZE, buf->size >> 12); +			msg->msg0 |= FIELD_PREP(APPLE_RTKIT_BUFFER_REQUEST_IOVA, buf->dva); +		}  		return mbox_send(rtk->chan, msg);  	} @@ -193,6 +222,20 @@ int apple_rtkit_poll(struct apple_rtkit *rtk, ulong timeout)  		}  	} +	if (endpoint == APPLE_RTKIT_EP_OSLOG) { +		msgtype = FIELD_GET(APPLE_RTKIT_OSLOG_TYPE, msg.msg0); + +		if (msgtype == APPLE_RTKIT_OSLOG_BUFFER_REQUEST) { +			ret = rtkit_handle_buf_req(rtk, endpoint, &msg); +			if (ret < 0) +				return ret; +			return 0; +		} else { +			/* Ignore */ +			return 0; +		} +	} +  	if (endpoint == APPLE_RTKIT_EP_IOREPORT) {  		// these two messages have to be ack-ed for proper startup  		if (msgtype == 0xc || msgtype == 0x8) { | 
