cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

dmub_srv_stat.c (4102B)


      1/*
      2 * Copyright 2019 Advanced Micro Devices, Inc.
      3 *
      4 * Permission is hereby granted, free of charge, to any person obtaining a
      5 * copy of this software and associated documentation files (the "Software"),
      6 * to deal in the Software without restriction, including without limitation
      7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      8 * and/or sell copies of the Software, and to permit persons to whom the
      9 * Software is furnished to do so, subject to the following conditions:
     10 *
     11 * The above copyright notice and this permission notice shall be included in
     12 * all copies or substantial portions of the Software.
     13 *
     14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
     18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
     19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
     20 * OTHER DEALINGS IN THE SOFTWARE.
     21 *
     22 * Authors: AMD
     23 *
     24 */
     25
     26#include "dmub/dmub_srv_stat.h"
     27#include "dmub/inc/dmub_cmd.h"
     28
     29/**
     30 * DOC: DMUB_SRV STAT Interface
     31 *
     32 * These interfaces are called without acquiring DAL and DC locks.
     33 * Hence, there is limitations on whese interfaces can access. Only
     34 * variables exclusively defined for these interfaces can be modified.
     35 */
     36
     37/**
     38 * dmub_srv_stat_get_notification - Retrieves a dmub outbox notification, set up dmub notification
     39 *                                  structure with message information. Also a pending bit if queue
     40 *                                  is having more notifications
     41 *  @dmub: dmub srv structure
     42 *  @notify: dmub notification structure to be filled up
     43 *
     44 *  Returns: dmub_status
     45 */
     46enum dmub_status dmub_srv_stat_get_notification(struct dmub_srv *dmub,
     47						struct dmub_notification *notify)
     48{
     49	/**
     50	 * This function is called without dal and dc locks, so
     51	 * we shall not modify any dmub variables, only dmub->outbox1_rb
     52	 * is exempted as it is exclusively accessed by this function
     53	 */
     54	union dmub_rb_out_cmd cmd = {0};
     55
     56	if (!dmub->hw_init) {
     57		notify->type = DMUB_NOTIFICATION_NO_DATA;
     58		notify->pending_notification = false;
     59		return DMUB_STATUS_INVALID;
     60	}
     61
     62	/* Get write pointer which is updated by dmub */
     63	dmub->outbox1_rb.wrpt = dmub->hw_funcs.get_outbox1_wptr(dmub);
     64
     65	if (!dmub_rb_out_front(&dmub->outbox1_rb, &cmd)) {
     66		notify->type = DMUB_NOTIFICATION_NO_DATA;
     67		notify->pending_notification = false;
     68		return DMUB_STATUS_OK;
     69	}
     70
     71	switch (cmd.cmd_common.header.type) {
     72	case DMUB_OUT_CMD__DP_AUX_REPLY:
     73		notify->type = DMUB_NOTIFICATION_AUX_REPLY;
     74		notify->link_index = cmd.dp_aux_reply.control.instance;
     75		notify->result = cmd.dp_aux_reply.control.result;
     76		dmub_memcpy((void *)&notify->aux_reply,
     77			(void *)&cmd.dp_aux_reply.reply_data, sizeof(struct aux_reply_data));
     78		break;
     79	case DMUB_OUT_CMD__DP_HPD_NOTIFY:
     80		if (cmd.dp_hpd_notify.hpd_data.hpd_type == DP_HPD) {
     81			notify->type = DMUB_NOTIFICATION_HPD;
     82			notify->hpd_status = cmd.dp_hpd_notify.hpd_data.hpd_status;
     83		} else {
     84			notify->type = DMUB_NOTIFICATION_HPD_IRQ;
     85		}
     86
     87		notify->link_index = cmd.dp_hpd_notify.hpd_data.instance;
     88		notify->result = AUX_RET_SUCCESS;
     89		break;
     90	case DMUB_OUT_CMD__SET_CONFIG_REPLY:
     91		notify->type = DMUB_NOTIFICATION_SET_CONFIG_REPLY;
     92		notify->link_index = cmd.set_config_reply.set_config_reply_control.instance;
     93		notify->sc_status = cmd.set_config_reply.set_config_reply_control.status;
     94		break;
     95	default:
     96		notify->type = DMUB_NOTIFICATION_NO_DATA;
     97		break;
     98	}
     99
    100	/* Pop outbox1 ringbuffer and update read pointer */
    101	dmub_rb_pop_front(&dmub->outbox1_rb);
    102	dmub->hw_funcs.set_outbox1_rptr(dmub, dmub->outbox1_rb.rptr);
    103
    104	/**
    105	 * Notify dc whether dmub has a pending outbox message,
    106	 * this is to avoid one more call to dmub_srv_stat_get_notification
    107	 */
    108	if (dmub_rb_empty(&dmub->outbox1_rb))
    109		notify->pending_notification = false;
    110	else
    111		notify->pending_notification = true;
    112
    113	return DMUB_STATUS_OK;
    114}